package com.liu.sunnyday.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.liu.sunnyday.dao.CheckgroupDao;
import com.liu.sunnyday.entity.QueryPageBean;
import com.liu.sunnyday.exception.SunnydayException;
import com.liu.sunnyday.pojo.CheckGroup;
import com.liu.sunnyday.service.CheckgroupService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * chance！Time
 *
 * @author liuqian
 * @date 2022-06-12 18:14
 * *
 */
@Service(interfaceClass = CheckgroupService.class)
public class CheckgroupServiceImpl implements CheckgroupService {

    @Autowired
    private CheckgroupDao checkgroupDao;

    /**
     * 1-分页查询所有
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageInfo<CheckGroup> findPage(QueryPageBean queryPageBean) {
        //分页查询 拦截器思想
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
        //判断搜索框中是否有条件需要查询
        if (!StringUtils.isEmpty(queryPageBean.getQueryString())) {
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }
        //调用dao
        List<CheckGroup> checkGroupList = checkgroupDao.findPageByCondition(queryPageBean.getQueryString());
        return new PageInfo<>(checkGroupList);
    }

    /**
     * 2-新增检查组
     *
     * @param checkGroup
     * @param checkitemIds
     */
    @Override
    public void add(CheckGroup checkGroup, Integer[] checkitemIds) {
        //1,先在检查组表中新增数据，并拿到新增后的id
        checkgroupDao.addCheckgroup(checkGroup);
        Integer checkgroup_id = checkGroup.getId();
        //中间表
        //HashMap<String,Object> map=new HashMap<>();
        //map.put("checkgroup_id",checkgroup_id);
        //map.put("checkitem_ids",checkitem_ids);

        //关于中间表，有两种情况1-复选框内没有数据不需要添加，2-有数据需要添加
        //也就是说看checkitem_ids数组中是否有数据
        if (null != checkitemIds) {
            //有数据
            for (Integer checkitem_id : checkitemIds) {
                //System.out.println(checkitem_id);
                //在中间表添加数据
                checkgroupDao.addz(checkgroup_id, checkitem_id);
            }
        }
    }

    /**
     * 3-1检查组编辑---查询检查组数据回显
     * @param id
     * @return
     */
    @Override
    public CheckGroup findById(Integer id) {
        //需要根据id查询检查组
        CheckGroup checkGroup = checkgroupDao.findById(id);
        return checkGroup;
    }

    /**
     * 3-2编辑检查组--根据检查组id查询检查项ids回显复选框
     * @param id
     * @return
     */
    @Override
    public List<Integer> findByCheckID(Integer id) {
        //需要根据id查询检查组和检查项的关联
        List<Integer> checkitemIds = checkgroupDao.findByCheckID(id);
        return checkitemIds;
    }

    /**
     * 4-编辑检查组--确定提交表单
     * @param checkGroup
     * @param checkitemIds
     */
    @Override
    @Transactional//事务
    public void update(CheckGroup checkGroup, Integer[] checkitemIds) {
        //4-1修改检查组
        checkgroupDao.update(checkGroup);
        //4-2修改检查组关联的检查项:先全部解除
        checkgroupDao.deleteBygroupId(checkGroup.getId());
        //然后在建立
        //关于checkitem_ids有两种情况：1，检查组关联的检查项可能是多个2，有可能没有一个
        //如果复选框内无id则无需在中间表添加
        if (null != checkitemIds) {
            for (Integer checkitem_id : checkitemIds) {
                //4-3
                checkgroupDao.insertBygroupId(checkGroup.getId(), checkitem_id);
            }
        }
    }

    /**
     * 5-删除检查组
     * @param id
     * @throws SunnydayException
     */
    @Override
    public void deleteById(Integer id) throws SunnydayException {
        //5-1删除，一定是先查询他有没有被套餐关联
        int count = checkgroupDao.findCountById(id);
        if (count > 0) {
            //如果有套餐和检查组关联就抛异常
            throw new SunnydayException("该检查组被套餐关联");
        }
        //如果没有
        //5-2删出检查项和检查组中间表的关联
        checkgroupDao.deleteItemById(id);
        //5-3先删检查项和检查组的外键关联外键，在删检查组
        checkgroupDao.deleteById(id);

//        //删除，一定是先查询他有没有被检查组关联
//        int count = checkgroupDao.findCountById(id);
//        if (count > 0) {
////            throw new SunnydayException("该检查项被检查组关联！");
//            checkgroupDao.deleteItemById(id);
//
//        }
//        int count1 = checkgroupDao.findcount1Byid(id);
//        if (count1 > 0) {
//            checkgroupDao.deletesById(id);
//        }
////        没有关联，直接删除，先删检查项和检查组的外键关联外键，在删检查组
//        checkgroupDao.deleteById(id);
    }
}
